package com.fmc123.base.utils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import org.apache.commons.lang3.time.DateFormatUtils;


/**
 * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
 * @author milo
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
	
	private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", 
		"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" };

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd）
	 */
	public static String getDate() {
		return getDate("yyyy-MM-dd");
	}
	
	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String getDate(String pattern) {
		return DateFormatUtils.format(new Date(), pattern);
	}
	
	/**
	 * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String formatDate(Date date, Object... pattern) {
		String formatDate = null;
		if (pattern != null && pattern.length > 0) {
			formatDate = DateFormatUtils.format(date, pattern[0].toString());
		} else {
			formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
		}
		return formatDate;
	}
	
	/**
	 * 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String formatDateTime(Date date) {
		return formatDate(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前时间字符串 格式（HH:mm:ss）
	 */
	public static String getTime() {
		return formatDate(new Date(), "HH:mm:ss");
	}

	/**
	 * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String getDateTime() {
		return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前年份字符串 格式（yyyy）
	 */
	public static String getYear() {
		return formatDate(new Date(), "yyyy");
	}

	/**
	 * 得到当前月份字符串 格式（MM）
	 */
	public static String getMonth() {
		return formatDate(new Date(), "MM");
	}

	/**
	 * 得到当天字符串 格式（dd）
	 */
	public static String getDay() {
		return formatDate(new Date(), "dd");
	}

	/**
	 * 得到当前星期字符串 格式（E）星期几
	 */
	public static String getWeek() {
		return formatDate(new Date(), "E");
	}
	
	/**
	 * 日期型字符串转化为日期 格式
	 * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", 
	 *   "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
	 */
	public static Date parseDate(Object str) {
		if (str == null){
			return null;
		}
		try {
			return parseDate(str.toString(), parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 获取过去的天数
	 * @param date
	 * @return
	 */
	public static long pastDays(Date date) {
		long t = new Date().getTime()-date.getTime();
		return t/(24*60*60*1000);
	}
	
    
	public static Date getDateStart(Date date) {
		if(date==null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			date= sdf.parse(formatDate(date, "yyyy-MM-dd")+" 00:00:00");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	public static Date getDateEnd(Date date) {
		if(date==null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			date= sdf.parse(formatDate(date, "yyyy-MM-dd") +" 23:59:59");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 判断字符串是否是日期
	 * @param timeString
	 * @return
	 */
	public static boolean isDate(String timeString){
		SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
		format.setLenient(false);
		try{
			format.parse(timeString);
		}catch(Exception e){
			return false;
		}
		return true;
	}
	
	/**
	 * 格式化时间
	 * @param timestamp
	 * @return
	 */
	public static String dateFormat(Date timestamp){
		SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return format.format(timestamp);
	}
	
	/**
	 * 获取系统时间Timestamp
	 * @return
	 */
	public static Timestamp getSysTimestamp(){
		return new Timestamp(new Date().getTime());
	}
	
	/**
	 * 获取系统时间Date
	 * @return
	 */
	public static Date getSysDate(){
		return new Date();
	}
	
	/**
	 * 生成时间随机数 
	 * @return
	 */
	public static String getDateRandom(){
		String s=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
		return s;
	}
	
	/**
	 * @param args
	 * @throws ParseException
	 */
	public static void main(String[] args) throws ParseException {
//		System.out.println(formatDate(parseDate("2010/3/6")));
//		System.out.println(getDate("yyyy年MM月dd日 E"));
//		long time = new Date().getTime()-parseDate("2012-11-19").getTime();
//		System.out.println(time/(24*60*60*1000));
	}
	
	/**
	  * 以简单系统格式显示日期时间(yyyy-MM-dd)
	  * @return
	  */
	 public static String format(Date date){
	  try {
	   SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM-dd");
	   String sDate = f.format(date);
	   return sDate;
	  } catch (Exception ee) {
	   ee.printStackTrace();
	   return null;
	  }
	 }
	 
	 /**
		* @format1方法
		* <p>方法说明:显示格式：yyyy年MM月dd日 HH:mm</p>
	    * @param date
	    * @return
		* 
	 */
	public static String format1(Date date){
		 try {
			 SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy年MM月dd日 HH:mm");
			 String sDate = f.format(date);
			 return sDate;
		 } catch (Exception ee) {
			 ee.printStackTrace();
			 return null;
		 }
	 }

   /**
    * 按format格式化date
    */
   public static String format(Date date, String format) {
       SimpleDateFormat f = new SimpleDateFormat(format);
       return f.format(date);
   }

   /**
    * 按format 解析 dateString
    */
   public static Date parse(String dateSting, String format) throws ParseException {
       SimpleDateFormat f = new SimpleDateFormat(format);
       return f.parse(dateSting);
   }

   /**
    * 返回两个日期间的分钟数
    * 
    * @param begindate
    * @param enddate
    * @return
    */
   public static int getMinutesBetween(Date begindate,Date enddate){
   	Long mins   =   (enddate.getTime()-begindate.getTime())/(1000*60);
   	return mins.intValue();
   }
   
   /**
    * 返回两个日期间的天数
    * @param begindate 开始日期
    * @param enddate 结束日期
    * @param ignoreTime 是否去掉时间部分再做比较(只比较日期部分)
    * @return 结束日期大于开始日期时，返回正数，否则返回负数
    * 
    */
   public static int getDaysBetween(Date beginDate,Date endDate,Boolean ignoreTime) throws ParseException{
   	if (!ignoreTime){
   		Long days = (endDate.getTime()-beginDate.getTime())/(1000*60*24*60);
   		return days.intValue();
   	}else{
   		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
   		String strB=df.format(beginDate);
   		String strE=df.format(endDate);
   		Long days=(df.parse(strE).getTime()-df.parse(strB).getTime())/(1000*60*24*60);
   		return days.intValue();
   	}
   }
   
   /**
    * 判断是否到了运行任务的时候
    * @param type 备份方式
    * @param time 备份的时间
    * @param bkdate 方式为2时，记录星期几，3时，记录几号
    * @return 是否到了运行任务的时候
    */
   
   public static boolean isRunTaskTime(String type,String time,Integer bkdate){
   	//不备份
   	if (type==null||type.trim().equals("")||type.equals("0")) return false;
   	//时间错误
   	if (time==null||time.trim().length()!=5) return false;
   	
   	//每天备份
   	if (type.equals("1")){
   		
   	}else if (type.equals("2")){
   		if (bkdate==null) return false;
   		Calendar cd=Calendar.getInstance();
   		int mynum=bkdate;

   		//数据库保存1为星期一,Java的是1为星期天,要分情况对应起来
   		int num=cd.get(Calendar.DAY_OF_WEEK)-1;
   		
   		//java为星期天,数据库保存的不为星期天
   		if (num==0&&mynum!=7){
   			return false;
   		}
   		
   		//星期一至星期六不相同
   		if(num!=0&&num!=mynum){
   			return false;
   		}	
   	}else if (type.equals("3")){
   		Calendar cd=Calendar.getInstance();
   		//今天
   		int nowd=cd.get(Calendar.DAY_OF_MONTH); 
   		//本月最后一天
   		int lastd=cd.getActualMaximum(Calendar.DAY_OF_MONTH);
   		//备份日期
   		int bkd=bkdate;
   		
   		//备份日期如果大于月份最后一天则取最后一天
   		if (bkd>lastd){bkd=lastd;}
   		if (nowd!=bkd){return false;}
   	}
   	
   	//未到时间或超过时间30分钟则不备份
   	if (!getBackupTime(time)) return false; 
   	
   	return true;
   }
   
   /**
    * 
    * @param 时间，格式： 12:20
    * @return 备份时间到后的三十分钟内才备份
    */
   private static boolean getBackupTime(String bkTime){
   	int minthen=0;
   	try{
   		minthen=Integer.parseInt(bkTime.substring(0,2))*60+Integer.parseInt(bkTime.substring(3,5));
   	}catch(Exception e){
   		System.out.println("时间格式错误:"+bkTime);
   		return false;
   	}
   	
   	Calendar cd=Calendar.getInstance();
   	int minNow=cd.get(Calendar.HOUR_OF_DAY)*60+cd.get(Calendar.MINUTE);
   	int ret=minNow-minthen;
   	
   	if (ret<0||ret>30) return false; //备份时间到后的三十分钟内才备份
   	return true;
   }
   
   public static String solrDateFormat(Date date) {
       SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
       f.setTimeZone(TimeZone.getTimeZone("GMT-0"));
       return f.format(new Date()).replace(" ", "T");
   }

   public static Date today() {
       Calendar now = Calendar.getInstance();
       setTimeToBeginningOfDay(now);
       return now.getTime();
   }
   
   public static Date daysFrom(Date date, int days) {
       Calendar cal = Calendar.getInstance();  
       cal.setTime(date);  
       cal.add(Calendar.DAY_OF_YEAR, days);
       return cal.getTime();
   }

   public static Date daysBefore(Date date, int days) {
       return daysFrom(date, -days);
   }

   public static Date daysFromNow(int days) {
       return daysFrom(new Date(), days);
   }

   public static Date daysAgo(int days) {
       return daysFromNow(-days);
   }

   public static Date tomorrow() {
       return daysFromNow(1);
   }

   public static Date yesterday() {
       return daysAgo(1);
   }

   public static void setTimeToBeginningOfDay(Calendar calendar) {
       calendar.set(Calendar.HOUR_OF_DAY, 0);
       calendar.set(Calendar.MINUTE, 0);
       calendar.set(Calendar.SECOND, 0);
       calendar.set(Calendar.MILLISECOND, 0);
   }

   public static void setTimeToEndofDay(Calendar calendar) {
       calendar.set(Calendar.HOUR_OF_DAY, 23);
       calendar.set(Calendar.MINUTE, 59);
       calendar.set(Calendar.SECOND, 59);
       calendar.set(Calendar.MILLISECOND, 999);
   }
}
